package restaurante.cgt;

import java.util.List;
import restaurante.cdp.ClienteDomiciliar;
import restaurante.cdp.Endereco;
import restaurante.cdp.Mesa;
import restaurante.cgd.ClienteDomiciliarDAO;
import restaurante.cgd.EnderecoDAO;
import restaurante.cgd.MesaDAO;
import restaurante.util.persistencia.DAOFactory;





public class AplControleCliente{

    private static AplControleCliente instance = null;
    private ClienteDomiciliarDAO apClienteDomiciliarDAO = (ClienteDomiciliarDAO) DAOFactory.getInstance().obterDAO(ClienteDomiciliar.class);
    private MesaDAO apMesaDAO = (MesaDAO) DAOFactory.getInstance().obterDAO(Mesa.class);
    private EnderecoDAO apEnderecoDAO = (EnderecoDAO) DAOFactory.getInstance().obterDAO(Endereco.class);
    
    

    private AplControleCliente() {
    }

    /**
     * Obtém uma instância da aplicação. Implementação do padrão Singleton.
     */
    public static AplControleCliente getInstance() {
        if (instance == null) {
     
                instance = new AplControleCliente();

        }
        return instance;
    }
    
    /**
     * Inclui uma mesa
     * @param args
     * @return A mesa cadastrada
     * @throws Exception 
     */
    public Mesa incluirMesa(List<Object> args) throws Exception
    {
        System.out.println("AplControleCliente - incluirMesa(List<Object> args)");
        Mesa obj = new Mesa();
        obj.setNumero(Integer.valueOf((String) args.get(0)));
        obj.setLugares(Integer.valueOf((String) args.get(1)));
        obj.setDescricao((String) args.get(2));
        apMesaDAO.salvar(obj);
        return obj;
    }
    
    /**
     * Altera um mesa
     * @param componentes
     * @param mesa
     * @throws Exception 
     */
    public void alterarMesa(List componentes, Mesa mesa) throws Exception
    {
        System.out.println("AplControleCliente - alterarMesa(List componentes, Mesa mesa)");
        Mesa m = apMesaDAO.obter(Mesa.class, mesa.getId());
        m.setNumero(Integer.valueOf((String) componentes.get(0)));
        m.setLugares(Integer.valueOf((String) componentes.get(1)));
        m.setDescricao((String) componentes.get(2));
        apMesaDAO.salvar(m);
    }
    
    /**
     * Obtem todas as mesas cadastradas
     * @return Uma lista com as mesas
     * @throws Exception 
     */
    public List<Mesa> obterMesas() throws Exception
    {
        System.out.println("AplControleCliente - obterMesa()");
        return apMesaDAO.obter(Mesa.class);
    }
    
    /**
     * Apaga um mesa
     * @param mesa
     * @throws Exception 
     */
    public void apagarMesa(Mesa mesa) throws Exception
    {
        System.out.println("AplControleCliente - apagarMesa(Mesa mesa)");
        apMesaDAO.excluir(mesa);
    }
    
    /**
     * Inclui um cliente domiciliar
     * @param args
     * @return O cliente domiciliar cadastrado
     * @throws Exception 
     */
    public ClienteDomiciliar incluirClienteDomiciliar(List<Object> args) throws Exception
    {
        System.out.println("AplControleCliente - incluirClienteDomiciliar(List<Object> args)");
        Endereco end = new Endereco();
        ClienteDomiciliar obj = new ClienteDomiciliar();
        obj.setNome((String) args.get(0));
        obj.setCpf(Long.valueOf((String) args.get(1)));
        end.setLogradouro((String) args.get(2));
        end.setBairro((String) args.get(3));
        end.setNumero(Integer.valueOf((String) args.get(4)));
        end.setCep(Long.valueOf((String) args.get(5)));
        end.setComplemento((String) args.get(6));
        obj.setEndereco(end);
        apEnderecoDAO.salvar(end);
        apClienteDomiciliarDAO.salvar(obj);
        
        return obj;
    }
    
    /**
     * Altera um cliente domiciliar
     * @param componentes
     * @param clienteDomiciliar
     * @throws Exception 
     */
    public void alterarClienteDomiciliar(List componentes, ClienteDomiciliar clienteDomiciliar) throws Exception
    {
        System.out.println("AplControleCliente - alterarClienteDomiciliar(List componentes, ClienteDomiciliar clienteDomiciliar)");
        Endereco end = apEnderecoDAO.obter(Endereco.class, clienteDomiciliar.getEndereco().getId());
        ClienteDomiciliar obj = apClienteDomiciliarDAO.obter(ClienteDomiciliar.class, clienteDomiciliar.getId());
        obj.setNome((String) componentes.get(0));
        obj.setCpf(Long.valueOf((String) componentes.get(1)));
        end.setLogradouro((String) componentes.get(2));
        end.setBairro((String) componentes.get(3));
        end.setNumero(Integer.valueOf((String) componentes.get(4)));
        end.setCep(Long.valueOf((String) componentes.get(5)));
        end.setComplemento((String) componentes.get(6));
        obj.setEndereco(end);
        apEnderecoDAO.salvar(end);
        apClienteDomiciliarDAO.salvar(obj);
    }
    
    /**
     * Obter todos os clientes domiciliares cadastrados
     * @return Uma lista com os clientes domiciliares
     * @throws Exception 
     */
    public List<ClienteDomiciliar> obterClienteDomiciliares() throws Exception
    {
        System.out.println("AplControleCliente - obterClienteDomiciliar()");
        return apClienteDomiciliarDAO.obter(ClienteDomiciliar.class);
    }
    
    /**
     * Apaga um cliente domiciliar
     * @param clienteDomiciliar
     * @throws Exception 
     */
    public void apagarClienteDomiciliar(ClienteDomiciliar clienteDomiciliar) throws Exception
    {
        System.out.println("AplControleCliente - apagarClienteDomiciliar(ClienteDomiciliar clienteDomiciliar)");
        apClienteDomiciliarDAO.excluir(clienteDomiciliar);
    }
    
   
    
    

    
}
